package com.alex.util.maths;

import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;

/**
 * @author alex
 */
public class DoubleUtil {

    /**
     * @param d
     * @return <p>
     * author: <a href="mailto:419420865@qq.com">ChengYiShou</a><br>
     * create at: 2014年4月16日上午12:34:54
     */
    public static double formatDouble1(double d) {
        DecimalFormat df = new DecimalFormat("#.00");
        return Double.parseDouble(df.format(d));
    }

    /**
     * @param d
     * @return <p>
     * author: <a href="mailto:419420865@qq.com">ChengYiShou</a><br>
     * create at: 2014年4月16日上午12:34:54
     */
    public static double formatDouble2(double d) {
        BigDecimal bg = new BigDecimal(d).setScale(2, RoundingMode.UP);
        return bg.doubleValue();
    }

    /**
     * NumberFormat is the abstract base class for all number formats. This
     * class provides the interface for formatting and parsing numbers.
     *
     * @param d
     * @return
     */
    public static String formatDouble3(double d) {
        NumberFormat nf = NumberFormat.getNumberInstance();
        // 保留两位小数
        nf.setMaximumFractionDigits(2);
        // 如果不需要四舍五入，可以使用RoundingMode.DOWN
        nf.setRoundingMode(RoundingMode.UP);
        return nf.format(d);
    }

    public static Double formatDouble9(double d) {
        // 新方法，如果不需要四舍五入，可以使用RoundingMode.DOWN
        BigDecimal bg = new BigDecimal(d).setScale(2, RoundingMode.DOWN);
        return bg.doubleValue();
    }

    /**
     * 这个方法挺简单的。 DecimalFormat is a concrete subclass of NumberFormat that
     * formats decimal numbers.
     *
     * @param d
     * @return
     */
    public static String formatDouble4(double d) {
        DecimalFormat df = new DecimalFormat("#.00");

        return df.format(d);
    }

    /**
     * 如果只是用于程序中的格式化数值然后输出，那么这个方法还是挺方便的。
     * 应该是这样使用：System.out.println(String.format("%.2f", d));
     *
     * @param d
     * @return
     */
    public static String formatDouble5(double d) {
        return String.format("%.2f", d);
    }

    /**
     * 判断字符是否可以转化成double
     */

    public static boolean isDoubleFormat(String str) {
        if (str == null) {
            return false;
        }
        try {
            Double.parseDouble(str);
            return true;
        } catch (NumberFormatException e) {
            //错误处理
            return false;
        }
    }

    /**
     * 格式化小数点，保留两位
     *
     * @param j
     * @return
     */
    public static Double formatDouble6(Double j) {
        DecimalFormat df = new DecimalFormat("0.00");//格式化小数，不足的补0
        String spot = df.format(j);
        return Double.parseDouble(spot);
    }

    /**
     * 最后一位与小数进1
     *
     * @param d 要处理的数据
     * @param n 保留小数点几位
     */
    public static double formatDouble7(double d, int n) {
        BigDecimal b = new BigDecimal(d, MathContext.DECIMAL32);
        b = b.divide(BigDecimal.ONE, n, BigDecimal.ROUND_CEILING);
        return b.doubleValue();
    }

    /**
     * @param
     * @return <p>
     * author: <a href="mailto:419420865@qq.com">ChengYiShou</a><br>
     * create at: 2014年4月16日上午12:34:54
     */
    public static double formatDouble8(double d) {
        DecimalFormat df = new DecimalFormat("#.000");
        return Double.parseDouble(df.format(d));
    }

}
